package com.zc.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;

import java.util.Objects;

/**
 * @description:
 * @author: cong
 * @create: 2025/3/11
 */
@Configuration
public class RedisPubSubConfig {

    /**
     * 配置Redis消息监听器容器
     *
     * 此方法用于创建并配置一个RedisMessageListenerContainer实例，该实例用于监听指定主题的消息
     * 主要涉及两个关键配置：连接工厂的设置和消息监听器的添加
     *
     * @param redisTemplate Redis模板，用于操作Redis数据库，这里主要用于获取连接工厂
     * @param adapter 消息监听器适配器，用于处理接收到的消息
     * @return 返回配置好的RedisMessageListenerContainer实例
     */
    @Bean
    RedisMessageListenerContainer redisMessageListenerContainer(RedisTemplate<String, Object> redisTemplate,
                                                                MessageListenerAdapter adapter) {
        // 创建RedisMessageListenerContainer实例
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();

        // 设置连接工厂，确保容器能够连接到Redis服务器
        // 使用Objects.requireNonNull确保传入的redisTemplate不为null，避免空指针异常
        container.setConnectionFactory(Objects.requireNonNull(redisTemplate.getConnectionFactory()));

        // 添加消息监听器，指定监听的主题模式为"topic:cong"
        // 这里使用PatternTopic表示监听符合模式的主题，而不是确切的主题名称
        container.addMessageListener(adapter, new PatternTopic("topic:cong"));

        // 返回配置好的RedisMessageListenerContainer实例
        return container;
    }

    /**
     * 创建一个MessageListenerAdapter实例，并将其配置为使用指定的消息监听器和处理方法
     * 此方法允许在接收到消息时，调用消息监听器的特定方法来处理消息
     *
     * @param listener 消息监听器接口的实现类实例，负责处理接收到的消息
     * @return 返回一个配置了特定消息处理方法的MessageListenerAdapter实例
     */
    @Bean
    MessageListenerAdapter messageListenerAdapter(MessageListener listener) {
        return new MessageListenerAdapter(listener, "onMessage");
    }

    /**
     * 定义一个Bean类型的MessageListener，用于监听和处理消息
     * 此处使用Lambda表达式来简化实现，直接定义消息处理逻辑
     *
     * @return MessageListener实例，用于监听和处理消息
     */
    @Bean
    MessageListener messageListener() {
        // 当接收到消息时，打印消息内容
        return (message, pattern) -> System.out.println("接收到消息：" + message);
    }
}
